昨天的統編驗收案例提醒我,測資選錯,程式也能一路綠燈。今天換 taiwan-library,看起來更沒難度:下載一份 CSV,挑出公共圖書館,回傳地址。結果最值得記下來的不是下載,而是「公共圖書館」到底該怎麼比對。
這個 skill 用的是國家圖書館彙編的圖書館名錄,不是館藏搜尋。2026-10-01 重跑 repo 的下載指令,拿到 488,775 bytes、5,207 筆館舍資料,和文件 9/19 的基準一致。七個欄位依序是序號、中文館名、郵遞區號、縣市、區域、中文地址、圖書館類型。
第一個小坑還是編碼:這份 CSV 是 Big5,不是 UTF-8。今天直接用嚴格的 decode('big5') 解碼成功;我沒有用忽略錯誤的方式把亂碼藏起來。資料能讀,才開始算。
如果用 類型 == '公共圖書館',答案是 610。如果問「類型裡包含公共圖書館的館舍」,答案是 644。差的 34 筆,類型全都寫成 專門圖書館, 公共圖書館。
不是今天突然多開了 34 間,也不是資料重複,而是同一欄允許複合分類。把它當單選欄位,程式照跑,結果卻悄悄少一截。這正是 SKILL 選用包含比對的原因。
| 2026-10-01 實測口徑 | 筆數 |
|---|---|
| 全部館舍紀錄 | 5,207 |
| 類型完全等於公共圖書館 | 610 |
| 類型為專門圖書館、公共圖書館的複合值 | 34 |
| 類型包含公共圖書館 | 644 |
| 上述包含比對,再限縣市為臺北市 | 63 |
63 也只代表這份名錄裡的符合紀錄,不代表現在開著的 63 間,更不代表每間都能現場借書。
下面沿用 repo 的下載網址,再用標頭名稱取欄位。2026-10-01 實測,這段列出的前三筆是古亭智慧圖書館、城中分館、王貫英先生紀念圖書館。
curl -sm 30 -A 'Mozilla/5.0' -o /tmp/lib.csv 'https://www.ncl.edu.tw/OpenDataFile/0Q112417873324994331/4cbfc49a-1127-45b1-9da6-113ebb444a12'
python3 - <<'PY'
import csv, io
raw = open('/tmp/lib.csv', 'rb').read().decode('big5')
rows = list(csv.DictReader(io.StringIO(raw)))
public = [r for r in rows if '公共圖書館' in r['圖書館類型']]
taipei = [r for r in public if r['縣市'] == '臺北市']
print('全部', len(rows), '公共類型', len(public), '臺北市', len(taipei))
for r in taipei[:3]:
print(r['中文館名'], '-', r['中文地址'])
PY
城中分館這筆地址是「臺北市中正區濟南路二段46號3樓」。有館名和地址,已經能回答一個窄問題:名錄裡有哪些符合條件的館舍。再往外多答一句,就可能越界。
「附近有沒有圖書館」和「附近哪裡借得到這本書」不是同一題。前者還需要使用者的位置,以及距離判斷;後者需要各館館藏系統。這份 CSV 兩者都不會自動補上。開館時間、臨時休館、入館資格也不能從一個地址推出來。
今天沒有改 repo。原本的包含比對是對的,我只是把它重跑一次,確認 610+34=644 仍成立。第 24 天的收穫很小,但很實際:回傳一個數字以前,先把那個數字在數什麼說清楚。